package com.ccc.scala.base5_function

object Function6_ {
  def main(args: Array[String]): Unit = {
    // 函数作为参数
    def test(f: () => Unit): Unit = {
      f()
    }

    // 函数
    def fun1(): Unit = {
      println("CJ")
    }
    // 调用
    test(fun1 _) // CJ

    // 有参函数作为参数
    def test2(f: (Int, Int) => Int): Unit = {
      println(f(10, 20))
    }

    // 有参函数
    def fun2(x: Int, y: Int): Int = {
      x + y
    }
    // 调用
    test2(fun2) // 30

    // 上面定义函数，实际上是可以用上一次的匿名函数来代替，并不断简化
    test2(
      (x: Int, y: Int) => {
        x + y
      }
    )

    // 简化
    // 如果函数体只有一行代码，大括号可以省略
    test2(
      (x: Int, y: Int) => x + y
    )

    // 如果参数的类型可以推断出来，那么参数类型可以省略
    test2(
      (x, y) => x + y
    )

    // 如果参数只有一个的话，参数列表可以省略 这里是两个就省略不了了

    // 如果参数在使用时，按照顺序只使用了一次，那么可以使用下划线代替参数
    test2(_ + _)

  }
}
